package _hash;

import org.junit.Assert;
import org.junit.Test;

import java.util.HashSet;
/*
https://leetcode.cn/problems/happy-number/description/
https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html

  202. 快乐数
  编写一个算法来判断一个数 n 是不是快乐数。

  「快乐数」 定义为：

  对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
  然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
  如果这个过程 结果为 1，那么这个数就是快乐数。
  如果 n 是 快乐数 就返回 true ；不是，则返回 false 。

  示例 1：

    输入：n = 19
    输出：true
    解释：
    12 + 92 = 82
    82 + 22 = 68
    62 + 82 = 100
    12 + 02 + 02 = 1

示例 2：
    输入：n = 2
    输出：false
 */

public class leetcode_202_Java {
    @Test
    public void test_1() {
        boolean actual = isHappy(19);
        boolean expect = true;
        Assert.assertEquals(expect, actual);
    }

    @Test
    public void test_2() {
        boolean actual = isHappy(2);
        boolean expect = false;
        Assert.assertEquals(expect, actual);
    }

    private boolean isHappy(int n) {
        // T - LogN
        // S - LogN
        HashSet<Integer> set = new HashSet<Integer>();
        // 结束条件 ： n == 1 , 或者 无限循环 - sum会重复出现 （set已经包含了这个数）
        while (n != 1 && !set.contains(n)) {
            set.add(n);
            n = sum(n);
        }

        return n == 1;
    }

    private int sum(int n) { // 19
        int sum = 0;
        while (n > 0) {
            // 注意：先得到余数
            int temp = n % 10; // 9 , 1
            sum += temp * temp;
            // 注意：再得到除数
            n = n / 10;
        }
        return sum;
    }
}
